package Collection.stream;

import java.util.ArrayList;
import java.util.List;
import java.util.Optional;
import java.util.Random;

/**
 * 演示常见的终端环节
 * 终端环节是流式操作的最后一步，用于获取结果
 */
public class StreamApiDemo2 {
    public static void main(String[] args) {
        Random rand =new Random();
        List<Integer> list =new ArrayList<>();
        for (int i = 0; i <10 ; i++) {
            list.add(rand.nextInt(100));//0-99随机数
        }
        System.out.println(list);
        /*
        常见的终端环节:
        1.min:用于获取流中的最小值
        2.max:用于获取流中的最大值
        3.anyMatch:判断流中是否有元素匹配lambda表达式的要求
        4.allMatch：判断流中是否所有元素匹配lambda表达式的要求
        5.noneMatch:判断流中是否没有元素匹配lambda表达式的要求
        6.reduce:积累操作
        Optional有点类似于包装类，内部保存了一个值
        通过get()方法可以获取Optional中的值
         */
        Optional<Integer> value=list.stream().min((e1,e2)->e1-e2);//升序
        System.out.println("最小值"+value.get());

        value=list.stream().max((e1,e2)->e1-e2);
        System.out.println("最大值"+value.get());

        //判断集合中是否有偶数
        boolean anyMatch =list.stream().anyMatch(e->e%2==0);//有偶数则为true
        System.out.println(anyMatch);
        //判断集合中是否所有元素都是偶数
        boolean allMatch=list.stream().allMatch(e->e%2==0);//所有偶数则为true
        System.out.println(allMatch);
        //判断集合是否没有偶数
        boolean noneMatch =list.stream().noneMatch(e->e%2==0);//一个偶数都没有则为true
        System.out.println(noneMatch);
        //对集合元素求和(累加所有集合元素)
        int num=list.stream().reduce((e1,e2)->e1+e2).get();//Integer自动拆箱成int了
        System.out.println(num);
    }
}
